//
//  StatusListViewModel.swift
//  WeiBlog
//
//  Created by apple on 15/10/20.
//  Copyright © 2015年 xiang. All rights reserved.
//

import Foundation
import SDWebImage
/// 单次加载的微博列表(默认20条)
class StatusListViewModel {
    
    //定义一个存放StatusViewModel视图模型的数组
    var listArr = [StatusViewModel]()
    
    ///  请求微博内容
    ///
    ///  - parameter token:    token值
    ///  - parameter finished: 回调,返回成功与否
    func askForStatus(finished:(isSuccessed:Bool) -> ()){
        
        
        let since_id = listArr.count > 0 ? (listArr.first?.status.id ?? 0) : 0
//        let max_id = listArr.count > 0 ? (listArr.first?.status?.id ?? 0) : 0
        NetworkManager.sharedManager.askForStatus(since_id: since_id,max_id: 0) { (resultData, error) -> () in
            
            if error != nil{
                print("加载微博内容失败")
                print(error)
                finished(isSuccessed: false)
                return
            }
            
            //拿到数据
            let resultDict = resultData as? [String:AnyObject]
            //通过key得到需要的数据(注意获得是一个数组)
            let statusesArr = resultDict!["statuses"] as? [[String:AnyObject]]
            // 定义一个数组,接受每次加载的数据
            var list = [StatusViewModel]()
            //遍历数组,进一步得到需要的数据
            //数组中每一条数据就是一条微博(一个字典)
            for statusData in statusesArr!{
                
                let status = Status(dict: statusData)
                
                let statusViewModel = StatusViewModel(status: status)
                
//                print(status)
                list.append(statusViewModel)
            
            }
            print("加载了\(list.count)条数据")
            
            //加一层 拼接 是为了刷新数据
            //在前面拼接,就是下拉刷新
            self.listArr = list + self.listArr
            
            print("加载微博内容成功")
            
            ///  缓存单张图片
            self.cacheImage(list, finished: finished)

            
        }
    }
 
    
    ///  缓存单张图片(这是提前缓存图片,只有当图片是一张时,我们才要提前下载,因为我们要根据图片的大小确定配图view的大小)
    ///
    ///  - parameter list:     单次缓存的微博数据
    ///  - parameter finished: 回调
    private func cacheImage(list:[StatusViewModel],finished:(isSuccessed:Bool) -> ()){
        
        //创建调度组
        let group = dispatch_group_create()
        //遍历数组
        for vm in list{
            
            if vm.imageURLs.count != 1{
                continue //结束本次循环
            }
            
            //入组(会将此后出现的所有block加入到调度组中)
            dispatch_group_enter(group)
            //这个方法会将图片缓存到磁盘中
            SDWebImageManager.sharedManager().downloadImageWithURL(vm.imageURLs[0],
                options: [],
                progress: nil,
                completed: { (image, _, _, _, _) -> Void in
                    //这里的image就是我们需要的图片
                    //在图片下载完成出组
                    dispatch_group_leave(group)
            })
  
        }
        //循环结束,当所有单图加载完毕,通知控制器更新UI
        dispatch_group_notify(group, dispatch_get_main_queue(), { () -> Void in
            //在图片下载完成,将成功回调,传给调用者
            finished(isSuccessed: true)
        })
        
    }
    
    /**
        注意:当我们指定了这个参数的内容:[SDWebImageOptions.RefreshCached,SDWebImageOptions.RetryFailed]
    当下载失败时,那么SdWebImage会重新执行下载,并且执行block,在这里,如果发生这样的情况,那么会重复出组,就会导致调度组不匹配,所以不指定
    
    SDWebImageManager.sharedManager().downloadImageWithURL(vm.imageURLs[0],
    options: [SDWebImageOptions.RefreshCached,SDWebImageOptions.RetryFailed],
    progress: nil,
    completed: { (image, _, _, _, _) -> Void in

    dispatch_group_leave(group)
    })
    */

    
    
    
    
}